// 导入登录请求接口
import { getUserInfoAPI, loginAPI, getUserDetailByIdAPI } from '@/api/user'
// 导入操作token模块文件
import { setToken, removeToken, getToken } from '@/utils/auth'
// 导入花裤衩封装的重置路由函数
import { resetRouter } from '@/router'
export default {
  // 告诉vuex，该模块所有的state 、mutations、actions里面的东西调用时都需要加上命名空间，这个命名空间就是该模块被improt时命名的名字。
  namespaced: true,
  // 保存数据
  state: {
    // 从本地存储中获取token，实现数据持久化，使用短路运算本地没有时就赋空值
    token: getToken() || '',
    // 用户信息
    userInfo: {}
  },
  // 修改数据
  mutations: {
    // 保存用户数据函数,token
    setToken(state, token) {
      // 将获取到的token 保存到state中
      state.token = token
      // 调用操作token模块的保存setToken函数，保存一份token到本地存储中
      setToken(token)
    },
    // 保存用户数据
    setUserInfo(state, userInfo) {
      // 用 浅拷贝的方式去赋值对象 因为这样数据更新之后，才会触发组件的更新
      state.userInfo = { ...userInfo }
    },
    // 删除用户信息
    reomveUserInfo(state) {
      state.userInfo = {}
    },
    // 删除token
    removeToken(state) {
      // 将state中的token设置为空
      state.token = ''
      // 调用操作token模块removeToken删除本地存储函数
      removeToken()
    }
  },
  // 异步请求
  actions: {
    // 登录请求函数，同时接收登录后返回的数据
    async login(context, data) {
      // 发送登录请求
      const res = await loginAPI(data)
      // 将获取到的登录返回数据提交到mutations的setUserInfo保存用户数据函数中
      context.commit('setToken', res)
    },

    // 封装获取用户信息函数
    async getUserInfo(context) {
      const result = await getUserInfoAPI() // 获取返回值
      // 因为getUserInfoAPI获取的用户数据不全，还需要根据返回的id继续获取剩余的用户信息
      const baseInfo = await getUserDetailByIdAPI(result.userId)
      const baseResult = { ...result, ...baseInfo } // 将两个接口结果合并
      // 使用拓展运算符将两个数据展开拼接到一个对象中
      context.commit('setUserInfo', baseResult) // 将整个的个人信息设置到用户的vuex数据中
      return baseResult // 这里为什么要返回 为后面埋下伏笔
    },

    // 登出登录功能
    logout(context) {
      context.commit('reomveUserInfo')
      context.commit('removeToken')
      // 退出时调用重置路由，避免高权限的用户退出后低权限的用户登录还能访问高权限用户的页面
      resetRouter()
    }
  }
}
